Fusion有提供多種拓撲摸式,上篇講過這篇不在贅述,這次選擇的是Host Mode為基礎,後續的開發內容也是基於Host Mode,Host Mode 下僅有Server端擁有變更聯網物件的能力,相對Shared Mode更好控制,但在行為上較為繁複。
async Task GameStart( )
{
var obj = new GameObject("gameRunner");
var runner = obj.AddComponent<NetworkRunner>();
var roomProperties = new Dictionary<string, SessionProperty>
{
{ "ROOMNAME", "DefaultRoomName" },
};
var result = await runner.StartGame(new StartGameArgs()
{
SessionName = UnityEngine.Random.Range(1, 9999).ToString(), // Session名稱
PlayerCount = 2, //最大人數
GameMode = GameMode.AutoHostOrClient, //連線模式
IsVisible = true, //在Lobby 中是否可見
IsOpen = true, // 能否加入
SessionProperties = roomProperties //Session的額外屬性,目前僅有房間名稱
});
if (result.Ok)
{
//連線成功的動作
}
}
上述的程式碼是建立一個連線,以及基本屬性設定,使用GameMode.AutoHostOrClient,自動處理是否為Host,倘諾已經有該session則會直接加入,如無的話則會建立一個新連線,倘諾僅需加入則只需有GameMode及SessionName。
async Task JoinGame(string sessionName)
{
var obj = new GameObject("gameRunner");
var runner = obj.AddComponent<NetworkRunner>();
var result = await runner.StartGame(new StartGameArgs
{
GameMode = GameMode.AutoHostOrClient,
SessionName = sessionName
});
if (result.Ok)
{
//連線成功的動作
}
}
但在這些方法下都需透過其他方法來獲得SessionName,Fusion中也有提供Lobby的功能,讓你無須四處走訪,也能獲得其他連線的SessionName,能夠更方便的建立諸如遊戲大廳的功能。
async Task JoinLobby()
{
var obj = new GameObject("gameRunner");
var runner = obj.AddComponent<NetworkRunner>();
var result = await runner.JoinSessionLobby(SessionLobby.ClientServer);
}
SessionLobby,可分為Shared跟ClientServer,主要是針對共享模式及伺服器/主機端模式做連線,也提供Custom選擇,只需要提供指定ID即可。
上面有多次使用到NetworkRunner這個組件,NetworkRunner是Photon Fusion 中的核心組件,許多功能都得經過他實現,如
都要靠他運行,下篇介紹INetworkRunnerCallbacks,專門處理網路相關事件,以及獲取相關資訊。
https://doc.photonengine.com/fusion/current/tutorials/host-mode-basics/2-setting-up-a-scene